
// 给定一个矩阵，请按照从外向里的顺序输出每一个数字到结果数组中

var spiralOrder: (matrix: number[][]) => number[] = function (matrix) {
    // 安全检测
    if (matrix.length < 1) {
        return [];
    }
    // 声明结果数组
    let res: number[] = [];
    // 声明上、下、左、右边界
    let leftBound: number = 0;
    let topBound: number = 0;
    let rightBound: number = matrix[0].length - 1;
    let bottomBound: number = matrix.length - 1;
    // 输出循环
    while (true) {
        // 从左到右
        for (let i = leftBound; i <= rightBound; i++) {
            res.push(matrix[topBound][i]);
        }
        // 上边界收缩
        topBound++;
        if (topBound > bottomBound) return res;
        // 从上到下
        for (let i = topBound; i <= bottomBound; i++) {
            res.push(matrix[i][rightBound]);
        }
        // 右边界收缩
        rightBound--;
        if (rightBound < leftBound) return res;
        // 从右到左
        for (let i = rightBound; i >= leftBound; i--) {
            res.push(matrix[bottomBound][i]);
        }
        // 下边界收缩
        bottomBound--;
        if (bottomBound < topBound) return res;
        // 从下到上
        for (let i = bottomBound; i >= topBound; i--) {
            res.push(matrix[i][leftBound]);
        }
        // 左边界收缩
        leftBound++;
        if (leftBound > rightBound) return res;
    }
};

        // 这道题目没有什么技巧，算是一道书写题
        // 观察顺时针输出的矩阵，我们发现当我们设定好矩阵的上下左右边界后
        // 每一轮输出矩阵元素的顺序均为 left->right,top->bottom,right->left,bottom->top
        // 所以我们在每一轮操作中分别做四个方向的循环，
        // 此外在每个方向循环的结束以后让该轮循环所处的边界进行收缩
        // 收缩之后我们就判断边界之间是否超出规定，
        // 如果超出了，就说明所有元素均输出完毕，之间返回结果数组即可。